package org.ljy.testdemo.utils;

//负责生成令牌和验证令牌

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;

import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class JwtUtils {


    private static long expiration =  30 * 60 * 1000;  //30分钟过期
    private static String secretString = "gaiosfhioawjfajrawrawrawrawrawrawrawrfjarawrawrawrafawfoawjfa";
    private static Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));//key值，数字签名

    /**
     * 生成令牌
     */
    public static String genJwt(Map<String, Object> data) {
        //生产token
        String compact = Jwts.builder()//固定方法
                        .setClaims(data)//设置数据
                        .setExpiration(new Date(System.currentTimeMillis()+expiration))//设置token的过期时间
                        .signWith(key)//设置数字签名
                        .compact();//生产token
        return compact;
    }

    /**
     * 校验令牌
     */
    public static Claims verify(String token){
        //生成token用的都是同一个key，所以不需要传参
        //获取build对象
        JwtParser build = Jwts.parserBuilder().setSigningKey(key).build();

        Claims claims = null;
        try {
            claims = build.parseClaimsJws(token).getBody();//与token校验
        }catch (ExpiredJwtException e){
            log.error("token过期, 校验失败, token:"+ token);
        }catch (Exception e){
            log.error("token校验失败, token:"+ token);
        }
        return claims;
    }

}
